//! # `std::net::IpAddr` 示例
//!
//! `IpAddr` 是一个枚举，表示一个 IP 地址，可以是 IPv4 或 IPv6。

use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};

/// ## `IpAddr::V4`
///
/// 创建一个 IPv4 地址。
pub fn ip_addr_v4_example() {
    let ipv4 = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
    println!("IPv4 地址: {}", ipv4);
    assert_eq!("127.0.0.1".parse(), Ok(ipv4));
}

/// ## `IpAddr::V6`
///
/// 创建一个 IPv6 地址。
pub fn ip_addr_v6_example() {
    let ipv6 = IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1));
    println!("IPv6 地址: {}", ipv6);
    assert_eq!("::1".parse(), Ok(ipv6));
}

/// ## `is_ipv4` 和 `is_ipv6`
///
/// 判断 `IpAddr` 是 IPv4 还是 IPv6 地址。
pub fn is_ipv4_ipv6_example() {
    let ipv4 = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
    let ipv6 = IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1));

    assert!(ipv4.is_ipv4());
    assert!(!ipv4.is_ipv6());
    assert!(ipv6.is_ipv6());
    assert!(!ipv6.is_ipv4());
}

/// ## `is_loopback`
///
/// 判断 IP 地址是否是环回地址。
pub fn is_loopback_example() {
    let ipv4_loopback = Ipv4Addr::new(127, 0, 0, 1);
    let ipv6_loopback = Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1);

    assert!(IpAddr::V4(ipv4_loopback).is_loopback());
    assert!(IpAddr::V6(ipv6_loopback).is_loopback());
}

/// ## `is_multicast`
///
/// 判断 IP 地址是否是多播地址。
pub fn is_multicast_example() {
    let ipv4_multicast = Ipv4Addr::new(224, 0, 0, 1);
    let ipv6_multicast = Ipv6Addr::new(0xff00, 0, 0, 0, 0, 0, 0, 1);

    assert!(IpAddr::V4(ipv4_multicast).is_multicast());
    assert!(IpAddr::V6(ipv6_multicast).is_multicast());
}
